package com.fowo.api.sys.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fowo.api.sys.annotation.DataActivity;
import com.fowo.api.sys.component.SysDataActivityAopHelper;
import com.fowo.api.sys.entity.SysDataActivity;
import com.fowo.api.sys.entity.enums.SysDataActivityAction;
import com.fowo.api.sys.model.SysDataActivityItemVo;
import com.fowo.api.sys.model.SysDataActivityParam;
import com.fowo.api.sys.model.SysDataActivitySearch;
import com.fowo.api.user.model.JwtUserInfo;

import java.util.List;

public interface SysDataActivityService {
    void create(SysDataActivity sysDataActivity);
    void createAsync(SysDataActivity sysDataActivity);
    void aopHandleAsync(SysDataActivityAopHelper.DataActivityAopContext context, DataActivity dataActivity, ServiceImpl<?, ?> serviceImpl, JwtUserInfo jwtUserInfo, Long id, Object oldObject, Object returnObject);
    List<SysDataActivityItemVo> search(SysDataActivitySearch search);
    Page<SysDataActivityItemVo> searchPage(SysDataActivitySearch search);   

    /**
     * 清空数据活动记录
     */
    boolean clean(); 

    /**
     * 获取数据活动参数
     */
    SysDataActivityParam getParam();

    /**
     * 更新数据活动参数
     * @param param
     */
    boolean updateParam(SysDataActivityParam param) throws Exception;

    /**
     * 获取指定数据源的行为记录是否已停用
     * @param dataSource 数据源标识
     * @param action 动作标识
     */
    boolean isDisable(String dataSource, SysDataActivityAction action);

    /** 自定义数据活动记录处理 */
    public interface CustomHandler {

        /**
         * 处理数据活动的方法
         * @param sysDataActivityService 数据活动服务
         * @param dataActivity 数据活动标记
         * @param serviceImpl 数据对象服务
         * @param jwtUserInfo 登录用户
         * @param id 数据编号
         * @param oldObject 原数据对象
         * @param returnObject 方法返回对象
         * @return 已经处理过返回 true, 否则为 false 服务继续处理
         */
        boolean handle(SysDataActivityService sysDataActivityService, DataActivity dataActivity, ServiceImpl<?, ?> serviceImpl, JwtUserInfo jwtUserInfo, Long id, Object oldObject, Object returnObject);
    }
}
